home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / PNL Libraries / MyListWindowHeaders.p < prev    next >
Text File  |  1995-07-05  |  5KB  |  237 lines

  1. unit MyListWindowHeaders;
  2.  
  3. interface
  4.  
  5.     uses
  6.         MyListWindow;
  7.  
  8.     const
  9.         columns_max = 7;
  10.         columns1 = columns_max + 1;
  11.  
  12.     type
  13.         OffsetsArray = array[1..columns1] of integer;
  14.         StringsArray = array[1..columns_max] of Str255;
  15.  
  16.     type
  17.         ListWindowHeadersObject = object(ListWindowObject)
  18.                 columns: integer;
  19.                 headers_strh_id: integer;
  20.                 sort_column: integer;
  21.                 off: OffsetsArray;
  22.                 gap, baseoff, headeroff: integer;
  23.                 aligns: array[boolean] of string[columns_max];
  24.                 procedure LDEF (message: integer; select: boolean; var r: Rect; c: Cell; dataOffset, dataLen: integer);
  25.                 override;
  26.                 procedure DrawHeader (r: rect);
  27.                 override;
  28.                 procedure DoHeaderClick (r: rect; where: Point; modifiers: integer);
  29.                 override;
  30.                 procedure GetHeaderStrings (var ss: StringsArray);
  31.                 procedure Strings (index: integer; var ss: StringsArray);
  32.                 procedure GetStringRect (r: rect; col: integer; var ss: StringsArray; var ther: rect; header: boolean);
  33.                 procedure DrawStrings (r: rect; var ss: StringsArray; select, header: boolean; hilite: integer);
  34.                 procedure MaxStrings (var maxs: OffsetsArray; var ss: StringsArray);
  35.                 procedure GetMaxs (var maxs: OffsetsArray);
  36.                 procedure SetOffs;
  37.             end;
  38.  
  39. implementation
  40.  
  41.     uses
  42.         TextUtils, MyUtils;
  43.  
  44.     procedure ListWindowHeadersObject.GetHeaderStrings (var ss: StringsArray);
  45.         var
  46.             i: integer;
  47.     begin
  48.         for i := 1 to columns do begin
  49.             GetIndString(ss[i], headers_strh_id, i);
  50.         end;
  51.     end;
  52.  
  53.     procedure ListWindowHeadersObject.Strings (index: integer; var ss: StringsArray);
  54.         var
  55.             i: integer;
  56.     begin
  57.         index:=index; { UNUSED! }
  58.         for i := 1 to columns do begin
  59.             ss[i] := '???';
  60.         end;
  61.     end;
  62.  
  63.     procedure ListWindowHeadersObject.MaxStrings (var maxs: OffsetsArray; var ss: StringsArray);
  64.         var
  65.             i, sw: integer;
  66.     begin
  67.         for i := 1 to columns do begin
  68.             sw := StringWidth(ss[i]);
  69.             if sw > maxs[i] then begin
  70.                 maxs[i] := sw;
  71.             end;
  72.         end;
  73.     end;
  74.  
  75.     procedure ListWindowHeadersObject.GetMaxs (var maxs: OffsetsArray);
  76.         var
  77.             i: integer;
  78.             ss: StringsArray;
  79.     begin
  80.         SetPort(window);
  81.         for i := 1 to columns do begin
  82.             maxs[i] := 0;
  83.         end;
  84.         GetHeaderStrings(ss);
  85.         MaxStrings(maxs, ss);
  86.     end;
  87.  
  88.     procedure ListWindowHeadersObject.SetOffs;
  89.         var
  90.             i: integer;
  91.             maxs: OffsetsArray;
  92.     begin
  93.         GetMaxs(maxs);
  94.         off[1] := gap;
  95.         for i := 1 to columns do begin
  96.             off[i + 1] := off[i] + maxs[i] + gap;
  97.         end;
  98.         SetListWidth(off[columns + 1]);
  99.     end;
  100.  
  101.     procedure ListWindowHeadersObject.GetStringRect (r: rect; col: integer; var ss: StringsArray; var ther: rect; header: boolean);
  102.         var
  103.             sw: integer;
  104.     begin
  105.         sw := StringWidth(ss[col]);
  106.         ther.top := r.top;
  107.         ther.bottom := r.bottom;
  108.         if header then begin
  109.             ther.bottom := ther.bottom - 3;
  110.         end;
  111.         case aligns[header][col] of
  112.             'L':  begin
  113.                 ther.left := r.left - list_offset + off[col];
  114.             end;
  115.             'R':  begin
  116.                 ther.left := r.left - list_offset + off[col + 1] - sw - gap;
  117.             end;
  118.             'C':  begin
  119.                 ther.left := r.left - list_offset + (off[col] + off[col + 1] - sw - gap) div 2;
  120.             end;
  121.         end;
  122.         ther.right := ther.left + sw;
  123.     end;
  124.  
  125.     procedure ListWindowHeadersObject.    DrawStrings (r: rect; var ss: StringsArray; select, header: boolean; hilite: integer);
  126.         var
  127.             ps: PenState;
  128.             i: integer;
  129.             ir: rect;
  130.     begin
  131.         SetPort(window);
  132.         GetPenState(ps);
  133.         PenNormal;
  134.         EraseRect(r);
  135.  
  136.         for i := 1 to columns do begin
  137.             GetStringRect(r, i, ss, ir, header);
  138.             if header then begin
  139.                 MoveTo(ir.left, ir.bottom - headeroff);
  140.             end
  141.             else begin
  142.                 MoveTo(ir.left, ir.bottom - baseoff);
  143.             end;
  144.             if header and (hilite = i) then begin
  145.                 TextFace([underline]);
  146.                 DrawString(ss[i]);
  147.                 TextFace([]);
  148.             end
  149.             else begin
  150.                 DrawString(ss[i]);
  151.             end;
  152.         end;
  153.  
  154.         if select then begin
  155.             HiliteInvertRect(r);
  156.         end;
  157.  
  158.         SetPenState(ps);
  159.     end;
  160.  
  161.     procedure ListWindowHeadersObject.DrawHeader (r: rect);
  162.         var
  163.             ss: StringsArray;
  164.     begin
  165.         GetHeaderStrings(ss);
  166.         DrawStrings(r, ss, false, true, sort_column);
  167.         MoveTo(r.left,r.bottom-2);
  168.         LineTo(r.right,r.bottom-2);
  169.     end;
  170.  
  171.     procedure ListWindowHeadersObject.DoHeaderClick (r: rect; where: Point; modifiers: integer);
  172.         var
  173.             i, j: integer;
  174.             ir: rect;
  175.             ss: StringsArray;
  176.             on, newon: boolean;
  177.     begin
  178.         modifiers:=modifiers; { UNUSED! }
  179.         j := -1;
  180.         GetHeaderStrings(ss);
  181.         for i := 1 to columns do begin
  182.             GetStringRect(r, i, ss, ir, true);
  183.             if PtInRect(where, ir) then begin
  184.                 j := i;
  185.                 leave;
  186.             end;
  187.         end;
  188.         if (j > 0) & (j <> sort_column) then begin
  189.             InsetRect(ir, -1, 1);
  190.             InvertRect(ir);
  191.             on := true;
  192.             while StillDown do begin
  193.                 GetMouse(where);
  194.                 newon := PtInRect(where, ir);
  195.                 if newon <> on then begin
  196.                     InvertRect(ir);
  197.                     on := newon;
  198.                 end;
  199.             end;
  200.             if on then begin
  201.                 InvertRect(ir);
  202.                 sort_column := j;
  203.                 DrawStrings(r, ss, false, true, sort_column);
  204.             end;
  205.         end;
  206.     end;
  207.  
  208.     procedure ListWindowHeadersObject.LDEF (message: integer; select: boolean; var r: Rect; c: Cell; dataOffset, dataLen: integer);
  209.         procedure LDClose;
  210.         begin
  211.         end;
  212.  
  213.         procedure LDDraw;
  214.             var
  215.                 ss: StringsArray;
  216.         begin
  217.             if datalen = 0 then begin
  218.                 Strings(c.v + 1, ss);
  219.                 DrawStrings(r, ss, select, false, 0);
  220.             end;
  221.         end;
  222.  
  223.     begin
  224.         dataOffset:=dataOffset; { UNUSED! }
  225.         case message of
  226.             lInitMsg: 
  227.                 ;
  228.             lDrawMsg: 
  229.                 LDDraw;
  230.             lHiliteMsg: 
  231.                 LDDraw;
  232.             lCloseMsg: 
  233.                 LDClose;
  234.         end;
  235.     end;
  236.  
  237. end.